Ver codigo
import pandas as pd
import plotly.express as pxLa tabla insumo es la que se muestra a continuacion. En ella encontramos los siguientes campos:
import pandas as pd
import plotly.express as pxdf = pd.read_csv('datasets/variables.csv')df.head()| No. | Clave INEGI | Entidad Federativa | Municipio | Estado de Fuerza Municipal DIC 2019 | Estado de Fuerza Municipal DIC 2024 | Porcentaje de incremento Estado de fuerza, últimos 5 años | Población 2020 | Estado de Fuerza Municipal MAR 2025 | Tasa de Policía Municipal por cada mil hab. | Salario CONASAMI 2024 | Salario bruto municipal 2024 Promedio | Diferencia | Evaluados en Control de Confianza | Aprobados en Control de Confianza | Aprobados vs. E.F. | Elementos con CUP | Elementos con CUP vs. E.F. | Confianza ENSU 2025 MAR | Desempeño ENSU 2025 MAR | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 1001 | Aguascalientes | Aguascalientes | 1431 | 1414 | -1.187980 | 948990 | 1387 | 1.461554 | 17862.30 | 17145.66 | -716.64 | 1386 | 1318 | 0.950252 | 1330 | 0.958904 | 13.30 | 0.577184 |
| 1 | 2 | 2002 | Baja California | Mexicali | 1572 | 1722 | 9.541985 | 1049792 | 1711 | 1.629847 | 20090.71 | 21028.17 | 937.46 | 1704 | 1650 | 0.964348 | 1598 | 0.933957 | 15.98 | 0.462853 |
| 2 | 3 | 2004 | Baja California | Tijuana | 2205 | 1784 | -19.092971 | 1922523 | 1779 | 0.925347 | 20090.71 | 19316.69 | -774.02 | 1776 | 1740 | 0.978078 | 1500 | 0.843170 | 15.00 | 0.332853 |
| 3 | 4 | 3008 | Baja California Sur | Los Cabos | 534 | 577 | 8.052434 | 351111 | 605 | 1.723102 | 20067.12 | 16000.00 | -4067.12 | 605 | 594 | 0.981818 | 553 | 0.914050 | 5.53 | 0.596330 |
| 4 | 5 | 4003 | Campeche | Carmen | 206 | 232 | 12.621359 | 248845 | 228 | 0.916233 | 17674.36 | 10851.84 | -6822.52 | 228 | 228 | 1.000000 | 227 | 0.995614 | 2.27 | 0.494143 |
Para crear el indice compuesto, seleccionamos las siguientes variables, ya que las demas no son usadas en el calculo de otros indicadores que aportan mayor valor estadistico:
Despues de normalizar las variables citadas, obtenemos las siguiente tabla. En ella solo vemos los campos relevantes para la creacion del indice con los valores normalizados y ordenados de mayor a menor segun el campo denominado “Indice”.
from sklearn.preprocessing import MinMaxScaler
cols_norm = [
'Porcentaje de incremento Estado de fuerza, últimos 5 años',
'Tasa de Policía Municipal por cada mil hab.',
'Diferencia ',
'Aprobados vs. E.F.',
'Elementos con CUP vs. E.F.',
'Confianza ENSU 2025 MAR',
'Desempeño ENSU 2025 MAR']
scaler = MinMaxScaler()
df[cols_norm] = scaler.fit_transform(df[cols_norm])df_norm = df[['Clave INEGI',
'Entidad Federativa',
'Municipio',
'Porcentaje de incremento Estado de fuerza, últimos 5 años',
'Tasa de Policía Municipal por cada mil hab.',
'Diferencia ',
'Aprobados vs. E.F.',
'Elementos con CUP vs. E.F.',
'Confianza ENSU 2025 MAR',
'Desempeño ENSU 2025 MAR']]df_norm.loc[:, ['Indice']] = df_norm[cols_norm].sum(axis=1)resultados = df_norm.sort_values('Indice', ascending=False).reset_index(drop=True)(
resultados
.head()
.style
.hide()
.format({'Porcentaje de incremento Estado de fuerza, últimos 5 años': '{:,.2f}',
'Tasa de Policía Municipal por cada mil hab.': '{:,.2f}',
'Diferencia ': '{:,.2f}',
'Aprobados vs. E.F.': '{:,.2f}',
'Elementos con CUP vs. E.F.': '{:,.2f}',
'Confianza ENSU 2025 MAR': '{:,.2f}',
'Desempeño ENSU 2025 MAR': '{:,.2f}',
'Indice': '{:,.2f}'})
)| Clave INEGI | Entidad Federativa | Municipio | Porcentaje de incremento Estado de fuerza, últimos 5 años | Tasa de Policía Municipal por cada mil hab. | Diferencia | Aprobados vs. E.F. | Elementos con CUP vs. E.F. | Confianza ENSU 2025 MAR | Desempeño ENSU 2025 MAR | Indice |
|---|---|---|---|---|---|---|---|---|---|---|
| 14120 | Jalisco | Zapopan | 0.50 | 0.89 | 0.32 | 0.95 | 0.94 | 0.95 | 0.86 | 5.41 |
| 14039 | Jalisco | Guadalajara | 0.57 | 0.97 | 0.36 | 0.93 | 0.97 | 1.00 | 0.59 | 5.39 |
| 15106 | México | Toluca | 1.00 | 0.98 | 0.14 | 0.99 | 1.00 | 0.67 | 0.60 | 5.38 |
| 8037 | Chihuahua | Juárez | 0.46 | 0.74 | 0.50 | 0.94 | 0.92 | 0.81 | 0.69 | 5.07 |
| 21114 | Puebla | Puebla | 0.59 | 0.59 | 0.26 | 0.98 | 0.99 | 0.77 | 0.68 | 4.87 |
resultados.to_csv('resultados.csv')fig = px.bar(resultados.head(10),
x='Indice',
y='Municipio',
orientation='h',
hover_data=['Municipio', 'Indice',],
height=600,
width=940,
text_auto=False,
custom_data=['Municipio', 'Indice'],)
fig.update_traces(textfont_size=12,
textangle=0,
textposition='outside',
marker_color='#691c32',
marker_line_color='#000000',
marker_line_width=1.5,
opacity=0.9,
hovertemplate =
"Municipio: %{y}<br>" +
"Indice: %{x:.2f}<br>")
fig.update_layout(
title=dict(text='Top 10 Municipios con Mayor Indice', font=dict(size=30), yref='paper'),
template='ggplot2',
autosize=False,
width=900,
height=500,
showlegend=True,
plot_bgcolor='#f8f8f8',
yaxis=dict(title='', autorange='reversed'),
xaxis=dict(title='Indice'),
margin=dict(
l=20,
r=20,
b=20,
t=50,
pad=4
)
)
fig.show()Puedes dar click en los siguientes links para descargar la tabla final ordenada por el campo Indice, tanto en formato CSV o en formato PDF.